﻿#region Header
// Copyright 2007-2011, Jerónimo Milea
// 
// This file is part of NetJsWire.
// 
//     NetJsWire is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as published by
//     the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
// 
//     NetJsWire is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
// 
//     You should have received a copy of the GNU General Public License
//     along with NetJsWire.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml;
using NetJsWire.JsonRpcHandler;
using NetJsWire.JsonRpcHandler.Attributes;
using NetJsWire.Widgets.Core;
using NetJsWire.Widgets.Renderers.Core;
using Newtonsoft.Json;

namespace NetJsWire.Widgets.Renderers.List
{
    [ClassName( "Ext.list.ListView" )]
    internal class ListView : Widget
    {
        private XmlNode _columnsNode;

        public ListView( object baseObject )
            : base( baseObject )
        {
        }

        public override void Render()
        {
            if ( !Rendered )
            {
                if ( BaseParent is IWidgetContainer )
                {
                    SetAttribute( ControlNode, "isInContainer", true );
                    SetConstructionProperty( "isInContainer", true );
                }
                else
                {
                    SetStyleProperty( "position", "absolute" );
                    SetConstructionProperty( "renderTo", ClientParentToRender );
                }

                EnsureParentNodePosition();
                RenderColumns();
            }
            base.Render();
        }

        private void RenderColumns()
        {
            var columns = new List<object>();

            if ( ControlNode[ "columns" ] == null )
            {
                _columnsNode = ControlNode.AppendChild( WebApplication.Instance.XmlDocument.CreateNode( XmlNodeType.Element, "columns", "" ) );
            }
            else
            {
                _columnsNode.RemoveAll();
            }

            foreach ( DataGridViewColumn col in Base.Columns )
            {
                var column = new
                                 {
                                     dataIndex = !string.IsNullOrEmpty( col.DataPropertyName ) ? col.DataPropertyName : col.Name,
                                     header = col.HeaderText,
                                     width = Math.Round( col.Width / ( double ) Base.Columns.Count / 100, 2 ),
                                     align = col.DefaultCellStyle != null ? col.DefaultCellStyle.Alignment.ToString().Contains( "Center" ) ? "center" : col.DefaultCellStyle.Alignment.ToString().Contains( "Right" ) ? "right" : "left" : "left"
                                 };

                columns.Add( column );
            }

            SetConstructionProperty( "columns", JsonConvert.SerializeObject( columns ) );
        }
    }
}
